package com.mdd.admin.config.wxpay;

import com.alibaba.fastjson.JSON;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.mdd.common.entity.pay.DevPay;
import com.mdd.common.entity.system.SystemConfig;
import com.mdd.common.entity.wxpay.SystemWxPayConfig;
import com.mdd.common.enums.OrderPlayTypeEnum;
import com.mdd.common.mapper.pay.DevPayMapper;
import com.mdd.common.mapper.system.SystemConfigMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author panweiliang
 */
@Configuration
@ConditionalOnClass(WxPayService.class)
@AllArgsConstructor
public class WxPayConfiguration {

    @Resource
    private DevPayMapper devPayMapper;

    @Resource
    private SystemConfigMapper systemConfigMapper;

    @Bean("mpWxPayService")
    public WxPayService mpWxPayService() {
        Boolean flag = Boolean.FALSE;
        WxPayConfig payConfig = new WxPayConfig();
        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
        String config = devPay.getConfig();
        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("mp_channel")));
        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
            flag = Boolean.TRUE;
        }
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
            flag = Boolean.TRUE;
        }
        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);
        WxPayService wxPayService = new WxPayServiceImpl();
        if (flag) {
            wxPayService.setConfig(payConfig);
        }
        return wxPayService;
    }

    @Bean("oaWxPayService")
    public WxPayService oaWxPayService() {
        Boolean flag = Boolean.FALSE;
        WxPayConfig payConfig = new WxPayConfig();
        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
        String config = devPay.getConfig();
        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("oa_channel")));
        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
            flag = Boolean.TRUE;
        }
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
            flag = Boolean.TRUE;
        }
        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);
        WxPayService wxPayService = new WxPayServiceImpl();
        if (flag) {
            wxPayService.setConfig(payConfig);
        }
        return wxPayService;
    }

    @Bean("h5WxPayService")
    public WxPayService h5WxPayService() {
        Boolean flag = Boolean.FALSE;
        WxPayConfig payConfig = new WxPayConfig();
        DevPay devPay = devPayMapper.getEntityByPayWay(OrderPlayTypeEnum.WECHAT_PAY.getType());
        String config = devPay.getConfig();
        SystemWxPayConfig systemWxPayConfig = JSON.parseObject(config, SystemWxPayConfig.class);
        //payConfig.setAppId(StringUtils.trimToNull(systemWxPayConfig.getAppId()));
        payConfig.setAppId(StringUtils.trimToNull(this.getAppId("h5_channel")));
        payConfig.setMchId(StringUtils.trimToNull(systemWxPayConfig.getMchId()));
        payConfig.setApiV3Key(StringUtils.trimToNull(systemWxPayConfig.getPaySignKey()));
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientKey())) {
            payConfig.setPrivateKeyContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientKey()).getBytes());
            flag = Boolean.TRUE;
        }
        if (StringUtils.isNotEmpty(systemWxPayConfig.getApiclientCert())) {
            payConfig.setPrivateCertContent(StringUtils.trimToNull(systemWxPayConfig.getApiclientCert()).getBytes());
            flag = Boolean.TRUE;
        }
        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);
        WxPayService wxPayService = new WxPayServiceImpl();
        if (flag) {
            wxPayService.setConfig(payConfig);
        }
        return wxPayService;
    }

    private String getAppId(String channel) {
        List<SystemConfig> configs = systemConfigMapper.getAppId(channel);
        Map<String, String> map = new LinkedHashMap<>();
        for (SystemConfig config : configs) {
            map.put(config.getName(), config.getValue());
        }
        return map.getOrDefault("appId", "");
    }


}
